ast-grep: Rule Object
これの組み合わせで、より複雑なクエリが書ける
1つのrule:内の
全てのfieldはoptional
全てのfieldのANDで検索される
なのでfieldの順序は関係ない
項目はたかだか11個ぐらいしかない
それを更に3つの種類に分類している
code:yml
rule:
# atomic rule
pattern: 'search.pattern'
kind: 'tree_sitter_node_kind'
regex: 'rust|regex'
# relational rule
inside: { pattern: 'sub.rule' }
has: { kind: 'sub_rule' }
follows: { regex: 'can|use|any' }
precedes: { kind: 'multi_keys', pattern: 'in.sub' }
# composite rule
not: { pattern: 'not.this' }
matches: 'utility-rule'
(けど、versionが上がるとたまに新しく生えていたりする)mrsekut.icon
f($A)にマッチさせたうえで、$Aだけ返す、とか書けないのかな #?? かけたわ
code:yml
id: APIを呼んでいる箇所を一覧する
language: TypeScript
rule:
kind: template_string
inside:
pattern: f($A)
stopBy: end
と思ったが、こんなことしなくても
$ ast-grep scan --json | jq '.[] | .metaVariables.single.A.text'
みたいにして、結果のjsonに対してjqしたほうが楽だmrsekut.icon
ノードが別のノードに囲まれているかどうかを確認するルール
例えば、「for文の中だけで検索」とかができる
inside: { pattern: 'sub.rule' }
has: { kind: 'sub_rule' }
follows: { regex: 'can|use|any' }
precedes: { kind: 'multi_keys', pattern: 'in.sub' }
stopBy
論理演算子を使用してサブルールを結合するルール。
all: [ {pattern: 'match.all'}, {kind: 'match_all'} ]
any: [ {pattern: 'match.any'}, {kind: 'match_any'} ]
not: { pattern: 'not.this' }
matches: 'utility-rule'